/**
 * @file .
 * @author wangxiaowei0303@163.com
 * 若干个可以让 std::string 更加强大,与方便使用的方法.
 */

#ifndef org_wxw0303_bishe_src_string_util_h
#define org_wxw0303_bishe_src_string_util_h

#include <string.h>
#include <stdarg.h>

#include <string>

/*
 * 根据格式字符串 format 的内容,将后续参数格式化为一个字符串,然后追加到 str
 * 的末尾,并返回 str 的引用,如:
 * @code
 *     append(str,"Hello,%d",360);
 *     // 等同于 str += "Hello,360";
 * @endcode
 * @param format 若为0,则视为空串;
 */
std::string&
vaddFormat(std::string &str,const char *format,va_list ap);

std::string&
addFormat(std::string &str,const char *format,...);

/*
 * s; 可能指向着一个以'\0'结尾的 C-字符串,也可能指向着一个字符数组.
 * 若 s 为 0,则视为空串.
 * 当 size < 0 时,表明 s 指向着 C 字符串,此时该函数返回该字符串的长度.
 * 当 size >=0 时,表明 s 指向着字符数组,并且 size 为该数组中字符个数,此时该
 *                函数只是返回 size.
 */
inline size_t
strSize(const char *s,int size = -1)
{
    return size < 0 ? (s == 0 ? 0 : strlen(s)) : size;
}

/*
 * 若字符数组 [s1,s1 + size1) 以数组 [s2,s2 + size2) 开头,则返回真,否则
 * 返回假.
 */
bool
beginWith(const char *s1,const char *s2,int size1 = -1,int size2 = -1);

/*
 * 若字符串(或字符数组) s1,s2 相等,则返回真,否则返回假.
 */
inline bool
strEqual(const char *s1,const char *s2,int size1,int size2)
{
    return size1 == size2 && strncmp(s1,s2,size1) == 0;
}

inline bool
strEqual(const char *s1,const char *s2)
{
    return strcmp(s1,s2) == 0;
}

/*
 * 将字符串 str 转化为 double 类型.
 * 若 str 格式不正确,则抛出异常.
 */
double
str2double(const char *str);


#endif /* org_wxw0303_bishe_src_string_util_h */


  
